mutable struct SteadyStateDict{R, S} <: ResultDict{R, S}
    toplevel::AbstractDict{R, S}
    internals

    function SteadyStateDict{R, S}(data::ResultDict{R, S}; internals = nothing) where {R, S}
        isa(internals, Nothing) || error("Supplying $(nameof(typeof(data))) and also internals to constructor not allowed")
        _toplevel = copy(data.toplevel)
        _internals = copy(data.internals)
        return new{R, S}(_toplevel, _internals)
    end

    function SteadyStateDict{R, S}(data::AbstractDict{R, S}; internals = nothing) where {R, S}
        _toplevel = copy(data)
        _internals = internals isa Nothing ? Dict() : copy(internals)
        return new{R, S}(_toplevel, _internals)
    end
end

SteadyStateDict(data::AbstractDict{R, S}; internals = nothing) where {R, S} = SteadyStateDict{R, S}(data; internals=internals)

function difference(s::SteadyStateDict, data_to_remove)
    return SteadyStateDict(Dict(setdiff(s.toplevel, data_to_remove)); internals=deepcopy(s.internals))
end

function _vector_valued(s::SteadyStateDict) 
    return OrderedSet([k for (k, v) ∈ s.toplevel if length(v) > 1])
end

UserProvidedSS = Dict{String, Union{Real, AbstractArray}}
